/**
 * OperationAdapter类通过适配器模式，将二分查找和快速排序的功能整合在一起
 * 它实现了ScoreOperation接口，允许外部通过该接口进行分数的查找和排序
 */
package com.loong;

public class OperationAdapter implements ScoreOperation {
    // 用于二分查找的对象
    private final BinarySearchClass searchObj;
    // 用于快速排序的对象
    private final QuickSortClass sortObj;

    /**
     * 构造方法初始化二分查找和快速排序的对象
     */
    public OperationAdapter() {
        this.searchObj = new BinarySearchClass();
        this.sortObj = new QuickSortClass();
    }

    /**
     * 实现ScoreOperation接口中的Search方法，使用二分查找算法
     * 
     * @param scores 分数数组，假定为升序排列
     * @param key 要查找的分数
     * @return 如果找到，返回分数在数组中的索引；如果未找到，返回-1
     * @throws IllegalArgumentException 如果输入数组为空或未排序
     */
    @Override
    public int Search(int[] scores, int key) {
        if (scores == null || scores.length == 0) {
            throw new IllegalArgumentException("输入数组不能为空");
        }
        if (!isSortedAscending(scores)) {
            throw new IllegalArgumentException("输入数组必须是升序排列，请先调用Sort方法");
        }
        return searchObj.BinarySearch(scores, key);
    }

    /**
     * 实现ScoreOperation接口中的Sort方法，使用快速排序算法
     *
     * @param scores 待排序的分数数组
     * @return 排序后的分数数组
     * @throws IllegalArgumentException 如果输入数组为空
     */
    @Override
    public int[] Sort(int[] scores) {
        if (scores == null || scores.length == 0) {
            throw new IllegalArgumentException("输入数组不能为空");
        }
        return sortObj.QuickSort(scores);
    }

    /**
     * 检查给定的分数数组是否为升序排列
     *
     * @param scores 待检查的分数数组
     * @return 如果数组是升序排列的，返回true；否则返回false
     */
    public boolean isSortedAscending(int[] scores) {
        if (scores == null || scores.length <= 1) {
            return true;
        }
        for (int i = 0; i < scores.length - 1; i++) {
            if (scores[i] > scores[i + 1]) {
                return false;
            }
        }
        return true;
    }
}
